home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / mod2.puma < prev    next >
Text File  |  1992-11-24  |  17KB  |  614 lines

  1. /* Ich, Doktor Josef Grosch, Informatiker, 26.1.1989 */
  2.  
  3. TRAFO TreeMod2
  4. TREE Tree
  5. PUBLIC TreeIO GetIterator
  6.  
  7. EXPORT    {
  8. FROM Positions    IMPORT tPosition;
  9.  
  10. VAR Iterator    : Tree.tTree;
  11.  
  12. PROCEDURE WriteLine (Line: tPosition);
  13. }
  14.  
  15. GLOBAL    {
  16.  
  17. FROM IO        IMPORT WriteS, WriteNl;
  18. FROM Sets    IMPORT IsElement;
  19. FROM Idents    IMPORT tIdent;
  20. FROM Positions    IMPORT tPosition;
  21.  
  22. FROM Tree    IMPORT
  23.    NoTree    , tTree        , Options    , ClassCount    ,
  24.    f        , WI    , WN    , iInteger    , itTree    ,
  25.    iNoTree    , iModule    , iMain        , HasChildren    ,
  26.    HasAttributes, NoCodeAttr    , NoCodeClass    ,
  27.    ForallClasses, ForallAttributes, Reverse    ;
  28.  
  29. VAR
  30.    iClassName    : tIdent;
  31.    RevChild    : tTree;
  32.  
  33. PROCEDURE WriteLine (Line: tPosition);
  34.    BEGIN
  35.       IF Line.Line # 0 THEN
  36.      !(* line ! WN (Line.Line); @ "@ WI (Line.File); @" *)@
  37.       END;
  38.    END WriteLine;
  39. }
  40.  
  41. PROCEDURE TreeIO (t: Tree)
  42.  
  43. Ag (..) :- {
  44.     !TYPE yyPtrtTree    = POINTER TO ! WI (itTree); !;!
  45.     !!
  46.     !VAR yyf    : IO.tFile;!
  47.     !VAR yyLabel    : SHORTCARD;!
  48.     !VAR yyKind    : SHORTCARD;!
  49.     !VAR yyc    : CHAR;!
  50.     !VAR yys    : Strings.tString;!
  51.     !!
  52.       IF IsElement (ORD (','), Options) THEN
  53.     !PROCEDURE yyMark (yyt: ! WI (itTree); !);!
  54.     ! BEGIN!
  55.     !  LOOP!
  56.     !   IF yyt = ! WI (iNoTree); ! THEN RETURN; END;!
  57.     !   INC (yyt^.yyHead.yyMark);!
  58.     !   IF yyt^.yyHead.yyMark > 1 THEN RETURN; END;!
  59.     !!
  60.     !   CASE yyt^.Kind OF!
  61.     ForallClasses (Classes, Mark);
  62.     !   ELSE RETURN;!
  63.     !   END;!
  64.     !  END;!
  65.     ! END yyMark;!
  66.     !!
  67.       END;
  68.       IF IsElement (ORD (';'), Options) THEN
  69.         !CONST yyInitTreeStoreSize    = 32;!
  70.     !!
  71.         !VAR yyTreeStoreSize    : LONGINT;!
  72.         !VAR yyTreeStorePtr    : POINTER TO ARRAY [0..50000] OF ! WI (itTree); !;!
  73.     !VAR yyLabelCount    : INTEGER;!
  74.     !VAR yyRecursionLevel    : SHORTINT;!
  75.     !!
  76.     !PROCEDURE yyMapToLabel (yyTree: ! WI (itTree); !): SHORTCARD;!
  77.     ! VAR yyi    : INTEGER;!
  78.     ! BEGIN!
  79.     !  FOR yyi := 1 TO yyLabelCount DO!
  80.     !   IF yyTreeStorePtr^[yyi] = yyTree THEN RETURN yyi; END;!
  81.     !  END;!
  82.     !  INC (yyLabelCount);!
  83.     !  IF yyLabelCount = yyTreeStoreSize THEN!
  84.     !   DynArray.ExtendArray (yyTreeStorePtr, yyTreeStoreSize, SYSTEM.TSIZE (! WI (itTree); !));!
  85.     !  END;!
  86.     !  yyTreeStorePtr^[yyLabelCount] := yyTree;!
  87.     !  RETURN yyLabelCount;!
  88.     ! END yyMapToLabel;!
  89.     !!
  90.     !PROCEDURE yyMapToTree (yyLabel: SHORTCARD): ! WI (itTree); !;!
  91.     ! BEGIN RETURN yyTreeStorePtr^[yyLabel]; END yyMapToTree;!
  92.     !!
  93.       END;
  94.       IF IsElement (ORD ('w'), Options) OR
  95.      IsElement (ORD ('o'), Options) THEN
  96.     !PROCEDURE yyWriteNl; BEGIN IO.WriteNl (yyf); END yyWriteNl;!
  97.     !!
  98.     !PROCEDURE yyWriteSelector (yys: ARRAY OF CHAR);!
  99.     ! BEGIN IO.WriteS (yyf, yys); Layout.WriteSpaces (yyf, 15 - INTEGER (HIGH (yys))); IO.WriteS (yyf, ' = '); END yyWriteSelector;!
  100.     !!
  101.     !PROCEDURE yyWriteHex (VAR yyx: ARRAY OF SYSTEM.BYTE);!
  102.     ! VAR yyi    : INTEGER;!
  103.     ! BEGIN!
  104.     !  FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO!
  105.     !   IO.WriteN (yyf, ORD (CHAR (yyx [yyi])), 2, 16);!
  106.     !   IO.WriteC (yyf, ' ');!
  107.     !  END;!
  108.     ! END yyWriteHex;!
  109.     !!
  110.       END;
  111.       IF IsElement (ORD ('o'), Options) THEN
  112.     !PROCEDURE yyWriteAdr (yyt: ! WI (itTree); !);!
  113.     ! BEGIN!
  114.     !  IF yyt = ! WI (iNoTree); ! THEN!
  115.     !   IO.WriteS (yyf, '! WI (iNoTree); !');!
  116.     !  ELSE!
  117.     !   yyWriteHex (yyt);!
  118.     !  END;!
  119.     !  yyWriteNl;!
  120.     ! END yyWriteAdr;!
  121.     !!
  122.     ForallClasses (Classes, WriteNode);
  123.     !PROCEDURE Write! WI (iModule); !Node (yyyf: IO.tFile; yyt: ! WI (itTree); !);!
  124.     ! BEGIN!
  125.     !  yyf := yyyf;!
  126.     !  IF yyt = ! WI (iNoTree); ! THEN!
  127.     !   IO.WriteS (yyf, '! WI (iNoTree); !'); yyWriteNl; RETURN;!
  128.     !  END;!
  129.     !!
  130.     !  CASE yyt^.Kind OF!
  131.     ForallClasses (Classes, WriteNodeName);
  132.     !  ELSE!
  133.     !  END;!
  134.     ! END Write! WI (iModule); !Node;!
  135.     !!
  136.       END;
  137.       IF IsElement (ORD ('w'), Options) THEN
  138.     !VAR yyIndentLevel    : SHORTINT;!
  139.     !!
  140.     !PROCEDURE Write! WI (iModule); ! (yyyf: IO.tFile; yyt: ! WI (itTree); !);!
  141.     ! VAR yySaveLevel    : SHORTINT;!
  142.     ! BEGIN!
  143.     !  yyf := yyyf;!
  144.     !  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;!
  145.     !  INC (yyRecursionLevel);!
  146.     !  yyMark (yyt);!
  147.     !  yySaveLevel := yyIndentLevel;!
  148.     !  yyIndentLevel := 0;!
  149.     !  yyWrite! WI (iModule); ! (yyt);!
  150.     !  yyIndentLevel := yySaveLevel;!
  151.     !  DEC (yyRecursionLevel);!
  152.     ! END Write! WI (iModule); !;!
  153.     !!
  154.     !PROCEDURE yyIndentSelector (yys: ARRAY OF CHAR);!
  155.     ! BEGIN Layout.WriteSpaces (yyf, yyIndentLevel); yyWriteSelector (yys); END yyIndentSelector;!
  156.     !!
  157.     !PROCEDURE yyIndentSelectorTree (yys: ARRAY OF CHAR; yyt: ! WI (itTree); !);!
  158.     ! BEGIN yyIndentSelector (yys); write! WI (itTree); ! (yyt) END yyIndentSelectorTree;!
  159.     !!
  160.     ForallClasses (Classes, WriteAttributes);
  161.     !PROCEDURE yyWrite! WI (iModule); ! (yyt: ! WI (itTree); !);!
  162.     ! VAR yyLevel    : SHORTCARD;!
  163.     ! BEGIN!
  164.     !  yyLevel := yyIndentLevel;!
  165.     !  LOOP!
  166.     !   IF yyt = ! WI (iNoTree); ! THEN!
  167.     !    IO.WriteS (yyf, ' ! WI (iNoTree); !'); yyWriteNl; EXIT;!
  168.     !   ELSIF yyt^.yyHead.yyMark = 0 THEN!
  169.     !    IO.WriteC (yyf, '^'); IO.WriteI (yyf, yyMapToLabel (yyt), 0); yyWriteNl; EXIT;!
  170.     !   ELSIF yyt^.yyHead.yyMark > 1 THEN!
  171.     !    yyWriteNl; IO.WriteN (yyf, yyMapToLabel (yyt), 6, 10); IO.WriteC (yyf, ':');!
  172.     !    Layout.WriteSpaces (yyf, yyIndentLevel - 7);!
  173.     !   ELSE!
  174.     !    IO.WriteC (yyf, ' ');!
  175.     !   END;!
  176.     !   yyt^.yyHead.yyMark := 0;!
  177.     !   INC (yyIndentLevel, 2);!
  178.     !!
  179.     !   CASE yyt^.Kind OF!
  180.     ForallClasses (Classes, WriteClassName);
  181.     !   ELSE EXIT;!
  182.     !   END;!
  183.     !  END;!
  184.     !  yyIndentLevel := yyLevel;!
  185.     ! END yyWrite! WI (iModule); !;!
  186.     !!
  187.       END;
  188.       IF IsElement (ORD ('r'), Options) THEN
  189.     !PROCEDURE Read! WI (iModule); ! (yyyf: IO.tFile): ! WI (itTree); !;!
  190.     ! VAR yyt    : ! WI (itTree); !;!
  191.     ! BEGIN!
  192.     !  yyf := yyyf;!
  193.     !  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;!
  194.     !  INC (yyRecursionLevel);!
  195.     !  IF NOT yyIsInitialized THEN!
  196.     !   yyInitKindToIdent; yyIsInitialized := TRUE;!
  197.     !  END;!
  198.     !  yyRead! WI (iModule); ! (SYSTEM.ADR (yyt));!
  199.     !  DEC (yyRecursionLevel);!
  200.     !  RETURN yyt;!
  201.     ! END Read! WI (iModule); !;!
  202.     !!
  203.     !PROCEDURE yyRead! WI (iModule); ! (yyt: yyPtrtTree);!
  204.     ! BEGIN!
  205.     !  LOOP!
  206.     !   CASE IO.ReadC (yyf) OF!
  207.     !   | '^': yyLabel := IO.ReadI (yyf); yyReadNl; yyt^ := yyMapToTree (yyLabel); RETURN;!
  208.     !   | 12C, '0': yyLabel := IO.ReadI (yyf); yyc := IO.ReadC (yyf);!
  209.     !    Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);!
  210.     !    yyKind := yyMapToKind (yys); yyt^ := Make! WI (iMain); ! (yyKind);!
  211.     !    IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '! WI (iModule); !: error in Read! 
  212.     WI (iModule); !'); IO.WriteNl (IO.StdError); yyExit; END;!
  213.     !   ELSE!
  214.     !    Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);!
  215.     !    yyKind := yyMapToKind (yys);!
  216.     !    IF yyKind = 0 THEN yyt^ := ! WI (iNoTree); !; RETURN; END;!
  217.     !    yyt^ := Make! WI (iMain); ! (yyKind);!
  218.     !   END;!
  219.     !!
  220.     !   CASE yyKind OF!
  221.     ForallClasses (Classes, ReadAttributes);
  222.     !   ELSE RETURN;!
  223.     !   END;!
  224.     !  END;!
  225.     ! END yyRead! WI (iModule); !;!
  226.     !!
  227.     !VAR yyKindToIdent    : ARRAY [0..! WN (ClassCount); !] OF Idents.tIdent;!
  228.     !VAR yyIsInitialized    : BOOLEAN;!
  229.     !!
  230.     !PROCEDURE yyMapToKind (VAR yys: Strings.tString): SHORTCARD;!
  231.     ! VAR yyi    : Idents.tIdent;!
  232.     ! VAR yyk    : SHORTCARD;!
  233.     ! BEGIN!
  234.     !  yyi := Idents.MakeIdent (yys);!
  235.     !  FOR yyk := 0 TO ! WN (ClassCount); ! DO!
  236.     !   IF yyKindToIdent [yyk] = yyi THEN RETURN yyk; END;!
  237.     !  END;!
  238.     !  RETURN 0;!
  239.     ! END yyMapToKind;!
  240.     !!
  241.     !PROCEDURE yyInitKindToIdent2 (yya: ARRAY OF CHAR; yyKind: SHORTCARD);!
  242.     ! VAR yys    : Strings.tString;!
  243.     ! BEGIN!
  244.     !  Strings.ArrayToString (yya, yys);!
  245.     !  yyKindToIdent [yyKind] := Idents.MakeIdent (yys);!
  246.     ! END yyInitKindToIdent2;!
  247.     !!
  248.     !PROCEDURE yyInitKindToIdent;!
  249.     ! BEGIN!
  250.     !  yyInitKindToIdent2 ('! WI (iNoTree); !', 0);!
  251.     ForallClasses (Classes, InitKindToIdent);
  252.     ! END yyInitKindToIdent;!
  253.     !!
  254.     !PROCEDURE yyReadNl; BEGIN IO.ReadNl (yyf); END yyReadNl;!
  255.     !!
  256.     !PROCEDURE yyReadIdent (): Idents.tIdent;!
  257.     ! VAR yys    : Strings.tString;!
  258.     ! BEGIN!
  259.     !  Strings.ReadL (yyf, yys);!
  260.     !  IO.UnRead (yyf);!
  261.     !  RETURN Idents.MakeIdent (yys);!
  262.     ! END yyReadIdent;!
  263.     !!
  264.     !PROCEDURE yyReadHex (VAR yyx: ARRAY OF SYSTEM.BYTE);!
  265.     ! VAR yyi    : INTEGER;!
  266.     ! BEGIN!
  267.     !  FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO!
  268.     !   yyx [yyi] := SYSTEM.BYTE (CHR (CARDINAL (IO.ReadN (yyf, 16))));!
  269.     !  END;!
  270.     ! END yyReadHex;!
  271.     !!
  272.     !PROCEDURE yySkip;!
  273.     ! BEGIN!
  274.     !  REPEAT UNTIL IO.ReadC (yyf) = '='; yyc := IO.ReadC (yyf);!
  275.     ! END yySkip;!
  276.     !!
  277.       END;
  278.     !CONST yyNil    = 374C;!
  279.     !CONST yyNoLabel    = 375C;!
  280.     !CONST yyLabelDef    = 376C;!
  281.     !CONST yyLabelUse    = 377C;!
  282.     !!
  283.       IF IsElement (ORD ('p'), Options) THEN
  284.     !PROCEDURE Put! WI (iModule); ! (yyyf: IO.tFile; yyt: ! WI (itTree); !);!
  285.     ! BEGIN!
  286.     !  yyf := yyyf;!
  287.     !  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;!
  288.     !  INC (yyRecursionLevel);!
  289.     !  yyMark (yyt);!
  290.     !  yyPut! WI (iModule); ! (yyt);!
  291.     !  DEC (yyRecursionLevel);!
  292.     ! END Put! WI (iModule); !;!
  293.     !!
  294.     !PROCEDURE yyPut! WI (iModule); ! (yyt: ! WI (itTree); !);!
  295.     ! BEGIN!
  296.     !  LOOP!
  297.     !   IF yyt = ! WI (iNoTree); ! THEN!
  298.     !    IO.WriteC (yyf, yyNil); RETURN;!
  299.     !   ELSIF yyt^.yyHead.yyMark = 0 THEN!
  300.     !    IO.WriteC (yyf, yyLabelUse); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);!
  301.     !    RETURN;!
  302.     !   ELSIF yyt^.yyHead.yyMark > 1 THEN!
  303.     !    IO.WriteC (yyf, yyLabelDef); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);!
  304.     IF ClassCount > 251 THEN
  305.     !    yyPut (yyt^.Kind);!
  306.     !   ELSIF yyt^.Kind > 251 THEN!
  307.     !    IO.WriteC (yyf, yyNoLabel); yyPut (yyt^.Kind);!
  308.     ELSE
  309.     !    IO.WriteC (yyf, CHR (yyt^.Kind));!
  310.     END;
  311.     !   ELSE!
  312.     !    IO.WriteC (yyf, CHR (yyt^.Kind));!
  313.     !   END;!
  314.     !   yyt^.yyHead.yyMark := 0;!
  315.     !!
  316.     !   CASE yyt^.Kind OF!
  317.     ForallClasses (Classes, PutAttributes);
  318.     !   ELSE RETURN;!
  319.     !   END;!
  320.     !  END;!
  321.     ! END yyPut! WI (iModule); !;!
  322.     !!
  323.     !PROCEDURE yyPut (VAR yyx: ARRAY OF SYSTEM.BYTE);!
  324.     ! VAR yyi    : INTEGER;!
  325.     ! BEGIN!
  326.     !  yyi := IO.Write (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);!
  327.     ! END yyPut;!
  328.     !!
  329.     !PROCEDURE yyPutIdent (yyi: Idents.tIdent);!
  330.     ! VAR yys    : Strings.tString;!
  331.     ! BEGIN!
  332.     !  Idents.GetString (yyi, yys);!
  333.     !  Strings.WriteL (yyf, yys);!
  334.     ! END yyPutIdent;!
  335.     !!
  336.       END;
  337.       IF IsElement (ORD ('g'), Options) THEN
  338.     !PROCEDURE Get! WI (iModule); ! (yyyf: IO.tFile): ! WI (itTree); !;!
  339.     ! VAR yyt    : ! WI (itTree); !;!
  340.     ! BEGIN!
  341.     !  yyf := yyyf;!
  342.     !  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;!
  343.     !  INC (yyRecursionLevel);!
  344.     !  yyGet! WI (iModule); ! (SYSTEM.ADR (yyt));!
  345.     !  DEC (yyRecursionLevel);!
  346.     !  RETURN yyt;!
  347.     ! END Get! WI (iModule); !;!
  348.     !!
  349.     !PROCEDURE yyGet! WI (iModule); ! (yyt: yyPtrtTree);!
  350.     ! BEGIN!
  351.     !  LOOP!
  352.     !   yyc := IO.ReadC (yyf);!
  353.     !   CASE yyc OF!
  354.     !   | yyNil    : yyt^ := ! WI (iNoTree); !; RETURN;!
  355.     !   | yyLabelUse    : yyGet (yyLabel); yyt^ := yyMapToTree (yyLabel); RETURN;!
  356.     !   | yyLabelDef    : yyGet (yyLabel);! 
  357.     IF ClassCount > 251 THEN
  358.     ! yyGet (yyKind);! 
  359.     ELSE
  360.     ! yyKind := ORD (IO.ReadC (yyf));! 
  361.     END;
  362.     ! yyt^ := Make! WI (iMain); ! (yyKind);!
  363.     !    IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '! WI (iModule); !: error in Get! 
  364.     WI (iModule); !'); IO.WriteNl (IO.StdError); yyExit; END;!
  365.     IF ClassCount > 251 THEN
  366.     !   | yyNoLabel    : yyGet (yyKind); yyt^ := Make! WI (iMain); ! (yyKind);!
  367.     END;
  368.     !   ELSE yyKind := ORD (yyc); yyt^ := Make! WI (iMain); ! (yyKind);!
  369.     !   END;!
  370.     !!
  371.     !   CASE yyKind OF!
  372.     ForallClasses (Classes, GetAttributes);
  373.     !   ELSE RETURN;!
  374.     !   END;!
  375.     !  END;!
  376.     ! END yyGet! WI (iModule); !;!
  377.     !!
  378.     !PROCEDURE yyGet (VAR yyx: ARRAY OF SYSTEM.BYTE);!
  379.     ! VAR yyi    : INTEGER;!
  380.     ! BEGIN!
  381.     !  yyi := IO.Read (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);!
  382.     ! END yyGet;!
  383.     !!
  384.     !PROCEDURE yyGetIdent (VAR yyi: Idents.tIdent);!
  385.     ! VAR yys    : Strings.tString;!
  386.     ! BEGIN!
  387.     !  Strings.ReadL (yyf, yys);!
  388.     !  yyi := Idents.MakeIdent (yys);!
  389.     ! END yyGetIdent;!
  390.     !!
  391.       END;
  392. }; .
  393.  
  394.  
  395. PROCEDURE WriteNodeName (t: Tree)
  396.  
  397. Class (..) :- {
  398.     IF (NoCodeClass * Properties) = {} THEN
  399.        !| ! WI (Name); !: IO.WriteS (yyf, '! WI (Name); !'); yyWriteNl;! 
  400.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  401.           ! yWriteNode! WI (Name); ! (yyt);! 
  402.        END;
  403.        !!
  404.     END;
  405. }; .
  406.  
  407.  
  408. PROCEDURE WriteNode (t: Tree)
  409.  
  410. Class (..) :- {
  411.     IF ((NoCodeClass * Properties) = {}) AND
  412.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  413.        !PROCEDURE yWriteNode! WI (Name); ! (yyt: ! WI (itTree); !);!
  414.        ! BEGIN!
  415.        IF (BaseClass^.Kind = Tree.Class) AND        (* NOT Top ? *)
  416.           (({HasChildren, HasAttributes} * BaseClass^.Class.Properties) # {}) THEN
  417.        !  yWriteNode! WI (BaseClass^.Class.Name); ! (yyt); !
  418.        END;
  419.        iClassName := Name;
  420.        ForallAttributes (Attributes, WriteNode);
  421.        ! END yWriteNode! WI (Name); !;!
  422.        !!
  423.     END;
  424. }; .
  425. Child (..) :- {
  426.     !  yyWriteSelector ('! WI (Name); !');! 
  427.     ! yyWriteAdr (yyt^.! WI (iClassName); !.! WI (Name); !);!
  428. }; .
  429. Attribute (..) :- {
  430.     IF (NoCodeAttr * Properties) = {} THEN 
  431.        !  yyWriteSelector ('! WI (Name); !'); write! WI (Type);
  432.        ! (yyt^.! WI (iClassName); !.! WI (Name); !) yyWriteNl;!
  433.     END;
  434. }; .
  435.  
  436.  
  437. PROCEDURE Mark (t: Tree)
  438.  
  439. Class (..) :- {
  440.     IF ((NoCodeClass * Properties) = {}) AND (HasChildren IN Properties) THEN
  441.        !| ! WI (Name); !:!
  442.        GetIterator (t);
  443.        iClassName := Name;
  444.        ForallAttributes (t, Mark);
  445.        IF Iterator = NoTree THEN
  446.           !RETURN;!
  447.        ELSE
  448.           !yyt := yyt^.! WI (iClassName); !.! WI (Iterator^.Child.Name); !;!
  449.        END;
  450.     END;
  451. }; .
  452. Child (..) :- {
  453.     IF t # Iterator THEN
  454.        !yyMark (yyt^.! WI (iClassName); !.! WI (Name); !);!
  455.     END;
  456. }; .
  457.  
  458.  
  459. PROCEDURE WriteClassName (t: Tree)
  460.  
  461. Class (..) :- {
  462.     IF (NoCodeClass * Properties) = {} THEN
  463.        !| ! WI (Name); !: ! 
  464.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  465.           !yWrite! WI (Name); ! (yyt); ! 
  466.           GetIterator (t);
  467.           IF Iterator = NoTree THEN
  468.          !EXIT;!
  469.           ELSE
  470.          !yyIndentSelector ('! WI (Iterator^.Child.Name); !'); ! 
  471.          !yyt := yyt^.! WI (Name); !.! WI (Iterator^.Child.Name); !;!
  472.           END;
  473.        ELSE
  474.           !IO.WriteS (yyf, '! WI (Name); !'); yyWriteNl; EXIT;!
  475.        END;
  476.     END;
  477. }; .
  478.  
  479.  
  480. PROCEDURE WriteAttributes (t: Tree)
  481.  
  482. Class (..) :- {
  483.     IF ((NoCodeClass * Properties) = {}) AND
  484.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  485.        !PROCEDURE yWrite! WI (Name); ! (yyt: ! WI (itTree); !);!
  486.        ! BEGIN!
  487.        !  IO.WriteS (yyf, '! WI (Name); !'); yyWriteNl;!
  488.        GetIterator (t);
  489.        iClassName := Name;
  490.        ForallAttributes (t, WriteAttributes);
  491.        ! END yWrite! WI (Name); !;!
  492.        !!
  493.     END;
  494. }; .
  495. Child (..) :- {
  496.     IF t # Iterator THEN
  497.        !  yyIndentSelectorTree ('! WI (Name); !', yyt^.! WI (iClassName); !.! WI (Name); !);!
  498.     END;
  499. }; .
  500. Attribute (..) :- {
  501.     IF (NoCodeAttr * Properties) = {} THEN 
  502.        !  yyIndentSelector ('! WI (Name); !'); ! 
  503.        !write! WI (Type); ! (yyt^.! WI (iClassName); !.! WI (Name); !) yyWriteNl;!
  504.     END;
  505. }; .
  506.  
  507.  
  508. PROCEDURE ReadAttributes (t: Tree)
  509.  
  510. Class (..) :- {
  511.     IF ((NoCodeClass * Properties) = {}) AND
  512.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  513.        !| ! WI (Name); !:!
  514.        GetIterator (t);
  515.        iClassName := Name;
  516.        ForallAttributes (t, ReadAttributes);
  517.        IF Iterator = NoTree THEN
  518.           !RETURN;!
  519.        ELSE
  520.           !yySkip; yyt := SYSTEM.ADR (yyt^^.! WI (iClassName); !.! WI (Iterator^.Child.Name); !);!
  521.        END;
  522.     END;
  523. }; .
  524. Child (..) :- {
  525.     IF t # Iterator THEN
  526.        !yySkip; read! WI (itTree); ! (SYSTEM.ADR (yyt^^.! WI (iClassName); !.! WI (Name); !))!
  527.     END;
  528. }; .
  529. Attribute (..) :- {
  530.     IF (NoCodeAttr * Properties) = {} THEN 
  531.        !yySkip; read! WI (Type); ! (yyt^^.! WI (iClassName); !.! WI (Name); !) yyReadNl;!
  532.     END;
  533. }; .
  534.  
  535.  
  536. PROCEDURE PutAttributes (t: Tree)
  537.  
  538. Class (..) :- {
  539.     IF ((NoCodeClass * Properties) = {}) AND
  540.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  541.        !| ! WI (Name); !:!
  542.        GetIterator (t);
  543.        iClassName := Name;
  544.        ForallAttributes (t, PutAttributes);
  545.        IF Iterator = NoTree THEN
  546.           !RETURN;!
  547.        ELSE
  548.           !yyt := yyt^.! WI (iClassName); !.! WI (Iterator^.Child.Name); !;!
  549.        END;
  550.     END;
  551. }; .
  552. Child (..) :- {
  553.     IF t # Iterator THEN
  554.        !put! WI (itTree); ! (yyt^.! WI (iClassName); !.! WI (Name); !)!
  555.     END;
  556. }; .
  557. Attribute (..) :- {
  558.     IF (NoCodeAttr * Properties) = {} THEN 
  559.        !put! WI (Type); ! (yyt^.! WI (iClassName); !.! WI (Name); !)!
  560.     END;
  561. }; .
  562.  
  563.  
  564. PROCEDURE GetAttributes (t: Tree)
  565.  
  566. Class (..) :- {
  567.     IF ((NoCodeClass * Properties) = {}) AND
  568.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  569.        !| ! WI (Name); !:!
  570.        GetIterator (t);
  571.        iClassName := Name;
  572.        ForallAttributes (t, GetAttributes);
  573.        IF Iterator = NoTree THEN
  574.           !RETURN;!
  575.        ELSE
  576.           !yyt := SYSTEM.ADR (yyt^^.! WI (iClassName); !.! WI (Iterator^.Child.Name); !);!
  577.        END;
  578.     END;
  579. }; .
  580. Child (..) :- {
  581.     IF t # Iterator THEN
  582.        !get! WI (itTree); ! (SYSTEM.ADR (yyt^^.! WI (iClassName); !.! WI (Name); !))!
  583.     END;
  584. }; .
  585. Attribute (..) :- {
  586.     IF (NoCodeAttr * Properties) = {} THEN 
  587.        !get! WI (Type); ! (yyt^^.! WI (iClassName); !.! WI (Name); !)!
  588.     END;
  589. }; .
  590.  
  591.  
  592. PROCEDURE InitKindToIdent (t: Tree)
  593.  
  594. Class (..) :- {
  595.     IF (NoCodeClass * Properties) = {} THEN
  596.        !  yyInitKindToIdent2 ('! WI (Name); !', ! WI (Name); !);!
  597.     END;
  598. }; .
  599.  
  600.  
  601. PROCEDURE GetIterator (t: Tree)
  602.  
  603. Class (..) :- {
  604.     Iterator := NoTree;
  605.     RevChild := NoTree;
  606.     ForallAttributes (t, GetIterator);
  607.     IF RevChild # NoTree THEN Iterator := RevChild; END;
  608. }; .
  609. Child (..) :- {
  610.     Iterator := t;
  611.     IF Reverse IN Properties THEN RevChild := t; END;
  612. }; .
  613.  
  614.